home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 5 / Gekikoh Dennoh Club Vol. 5 (Japan).7z / Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin / internet / webx / webxp040.lzh / Source / FuncUrl / FuncUrl.c next >
C/C++ Source or Header  |  1998-07-25  |  4KB  |  199 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5.  
  6. /* URL é≡ scheme/hostname/path/fname/query/port/anchor é╔ò¬ë≡é╖éΘ */
  7. int UrlSplit (char *url,
  8.           char *scheme, char *hostname, char *path, char *fname, char *query, char *anchor,
  9.           int *port)
  10. {
  11.     char c, *s = url, *d = NULL;
  12.     char *last_fname, *last_slash, *last_query = NULL, *last_anchor = NULL;
  13.     char *scheme_str[]=
  14.     {"http://", "file://"};
  15.     short h;
  16.  
  17.     *query = '\0';
  18.     *anchor = '\0';
  19.  
  20.     /* scheme é╔éµé┴é─ò¬è≥ */
  21.     for (h = 0; h < sizeof (scheme_str) / sizeof (char *); h++) {
  22.         if (!strnicmp (s, scheme_str[h], strlen (scheme_str[h])))
  23.             break;
  24.     }
  25.     switch (h) {
  26.     case 0:        /* http:// */
  27.         strcpy (scheme, "http://");    /* âfâtâHâïâgé═ HTTP */
  28.         *port = 80;
  29.         s += 7;
  30.         d = hostname;
  31.         while ((*d++ = *s++) != '/');
  32.         *(d - 1) = '\0';
  33.         d = path;
  34.         *d++ = '/';
  35.         break;
  36.     case 1:        /* file:// */
  37.         strcpy (scheme, "file://");
  38.         s += 7;
  39.         *port = 0;    /* ë╝é╔é▒éñé╡é╞é¡ */
  40.         *hostname = '\0';
  41.         d = path;
  42.         break;
  43. #if    0
  44.     case 2:        /* ftp:// */
  45.         strcpy (scheme, "ftp://");
  46.         s += 6;
  47.         *port = 20;
  48.         d = hostname;
  49.         while ((*d++ = *s++) != '/');
  50.         *(d - 1) = '\0';
  51.         d = path;
  52.         *d++ = '/';
  53.         break;
  54. #endif
  55.     default:
  56.         strcpy (scheme, "file://");
  57.         *port = 0;    /* ë╝é╔é▒éñé╡é╞é¡ */
  58.         *hostname = '\0';
  59.         d = path;
  60.         break;
  61.     }
  62.  
  63.  
  64.     last_fname = s;        /* ì┼îπé╠ '/' é╠ăé╠âAâhâîâXé≡ò█Ä¥üiâRâsü[î│üj */
  65.     last_slash = d;        /* ì┼îπé╠ '/' é╠ăé╠âAâhâîâXé≡ò█Ä¥üiâRâsü[ɵüj */
  66.     for (;;) {
  67.         c = *d++ = *s++;
  68.         if (c == '\0') {
  69.             if (last_query != NULL) {
  70.                 memcpy (fname, last_fname, last_query - last_fname);
  71.                 strcpy (query, last_query);
  72.                 *(fname + (last_query - last_fname)) = '\0';
  73.             } else {
  74.                 if (last_anchor != NULL) {
  75.                     memcpy (fname, last_fname, last_anchor - last_fname);
  76.                     strcpy (anchor, last_anchor);
  77.                     *(fname + (last_anchor - last_fname)) = '\0';
  78.                 } else {
  79.                     strcpy (fname, last_fname);
  80.                 }
  81.             }
  82.             *last_slash = '\0';
  83.             break;
  84.         }
  85.         if (c == '/') {
  86.             last_fname = s;
  87.             last_slash = d;
  88.         }
  89.         if (c == '?')
  90.             last_query = s - 1;
  91.         if (c == '#')
  92.             last_anchor = s - 1;
  93.     }
  94.  
  95.     return (0);
  96. }
  97.  
  98.  
  99. /* ùvæfé⌐éτîïìçé╡é─ URL é≡É╢ɼé╖éΘ "./" éΓ "../" éαé╡é┴é⌐éΦÅêù¥é╖éΘ */
  100. /* ÆAé╡ fname= "http://ü`" é╛é┴é╜ÅΩìçüAîïìçé╣é╕ url=fname é╞é╖éΘ */
  101. void UrlCat (char *url,        /* ò╘éΦÆl */
  102.          char *scheme, char *hostname, char *path, char *fname, char *query, char *anchor,
  103.          int port)
  104. {
  105.     char *p = fname, *q;
  106.     char c;
  107.     char *last_dir, *last_dir2;
  108.  
  109.     /* ÉΓæ╬âpâXÄwÆΦé╛é┴é╜ÅΩìç */
  110.     if (!strnicmp (fname, "http://", 7)) {
  111.         strcpy (url, fname);
  112.         return;
  113.     }
  114.     if (!strnicmp (fname, "file://", 7)) {
  115.         strcpy (url, fname);
  116.         return;
  117.     }
  118.     /* ê╚ë║æèæ╬âpâXÄwÆΦé╠Åêù¥ */
  119.     strcpy (url, scheme);
  120.     if (!stricmp (scheme, "http://")) {
  121.         if (port == 80)
  122.             strcat (url, hostname);
  123.         else
  124.             sprintf (url, "http://%s:%d", hostname, port);
  125.     }
  126.     /* '/' é⌐éτÄné▄éΘâtâ@âCâïû╝é╛é┴é╜ÅΩìç */
  127.     if (!strncmp (fname, "/", 1)) {
  128.         strcat (url, fname);
  129.         strcat (url, query);
  130.         return;
  131.     }
  132.     strcat (url, path);
  133.  
  134.     for (;;) {
  135.         if (!strncmp (p, "./", 2)) {
  136.             p += 2;
  137.             continue;
  138.         }
  139.         if (!strncmp (p, "../", 3)) {
  140.             p += 3;
  141.             q = last_dir = last_dir2 = url;
  142.             while (c = *q++) {
  143.                 if (c == '/') {
  144.                     last_dir2 = last_dir;
  145.                     last_dir = q;
  146.                 }
  147.             }
  148.             *last_dir2 = '\0';
  149.             continue;
  150.         }
  151.         break;
  152.     }
  153.     strcat (url, p);
  154.     strcat (url, query);
  155.     strcat (url, anchor);
  156. }
  157.  
  158.  
  159. #ifdef DEMO
  160. int main (int argc, char *argv[])
  161. {
  162.     char scheme[256], hostname[256], path[256], fname[256], query[256], anchor[256];
  163.     int port;
  164.     char url[256];
  165.  
  166.     /* UrlSplit() é╠âfâé */
  167.     printf ("UrlSplit() é╠âfâé\n");
  168.     strcpy (url, "http://www.mankai.co.jp/denkura/123/index.htm#tools");
  169.     UrlSplit (url, scheme, hostname, path, fname, query, anchor, &port);
  170.     printf ("url = %s é≡ UrlSplit() é╡é▄é╖\n", url);
  171.     printf ("    scheme    = %s\n"
  172.         "    hostname= %s\n"
  173.         "    path    = %s\n"
  174.         "    fname    = %s\n"
  175.         "    query    = %s\n"
  176.         "    anchor    = %s\n"
  177.         "    port    = %d\n\n", scheme, hostname, path, fname, query, anchor, port);
  178.  
  179.     /* UrlCat() é╠âfâé */
  180.     printf ("UrlCat() é╠âfâé\n");
  181.     strcpy (fname, "../124/index.htm");
  182.     strcpy (query, "?=UrlFunc");
  183.     port = 1080;
  184.     printf ("    scheme    = %s\n"
  185.         "    hostname= %s\n"
  186.         "    path    = %s\n"
  187.         "    fname    = %s\n"
  188.         "    query    = %s\n"
  189.         "    anchor    = %s\n"
  190.         "    port    = %d\n"
  191.         "é≡ UrlCat() é╡é▄é╖\n", scheme, hostname, path, fname, query, anchor, port);
  192.     UrlCat (url, scheme, hostname, path, fname, query, anchor, port);
  193.     printf ("url = %s\n", url);
  194.  
  195.     return (0);
  196. }
  197.  
  198. #endif
  199.